package com.lebang.common;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

/**
 * XML格式化/解析
 *
 * @author: weizx
 * @time: 2018年10月18日 下午9:30:20
 */
public class Xml {

    /**
     * 格式化
     *
     * @author: weizx
     * @time: 2018年10月18日 下午9:31:47
     */
    public static String format(Map<String, String> arr) {
        String xml = "<xml>";
        Iterator<Entry<String, String>> iter = arr.entrySet().iterator();
        while (iter.hasNext()) {
            Entry<String, String> entry = iter.next();
            String key = entry.getKey();
            String val = entry.getValue() == null ? "" : entry.getValue().toString();
            if (val.matches("\\d *")) { // 数值显示原值
                xml += "<" + key + ">" + val + "</" + key + ">";
            } else {
                xml += "<" + key + "><![CDATA[" + val + "]]></" + key + ">";
            }
        }
        xml += "</xml>";
        return xml;
    }

    /**
     * 解析
     *
     * @author: weizx
     * @time: 2018年10月18日 下午9:31:13
     */
    @SuppressWarnings("rawtypes")
    public static Map<String, String> parse(String input) {

        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read(new ByteArrayInputStream(input.getBytes("UTF-8")));
            Element root = document.getRootElement();
            Map<String, String> map = new HashMap<String, String>();
            // 定义子循环体的变量
            for (Iterator i = root.elementIterator(); i.hasNext(); ) {
                Element el = (Element) i.next();
                map.put(el.getName(), el.getText());
            }
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 转义解析
     *
     * @author: weizx
     * @time: 2018年10月18日 下午9:45:10
     */
    @SuppressWarnings("rawtypes")
    public static Map<String, String> parse(String input, String charset) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read(new ByteArrayInputStream(input.getBytes(charset)));
            Element root = document.getRootElement();
            Map<String, String> map = new HashMap<String, String>();
            // 定义子循环体的变量
            for (Iterator i = root.elementIterator(); i.hasNext(); ) {
                Element el = (Element) i.next();
                map.put(el.getName(), el.getText());
            }
            return map;
        } catch (Exception e) {
            return null;
        }
    }
}
